package com.project.sianet.data.HttpClient;

import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONStringer;
import org.json.JSONTokener;

import com.project.sianet.R;
import com.project.sianet.data.Client.MensajeClient;
import com.project.sianet.entidades.Mensaje;
import com.project.sianet.util.SessionManager;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
//import android.util.Log;

public class MensajeHttpClient implements MensajeClient {

	private final Context context;
    private final HttpClient httpClient;
//    private final SessionManager session;
    private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    
    public MensajeHttpClient(Context context) {
    	
    	this.context = context;
//		this.session = new SessionManager(context);
        BasicHttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params, false);
        httpClient = new DefaultHttpClient(params);
    	
    }
    
    @Override
	public List<Mensaje> getAllRecibidos(String codFamilia) {
    	
		List<Mensaje> result = new ArrayList<Mensaje>();	
		String content = get("Mail_getAllRecibidos/" + codFamilia.trim());
		
		if (content != null) {
			
			try {
				JSONTokener tokener = new JSONTokener(content);
				JSONArray array = (JSONArray) tokener.nextValue();
				for (int i = 0; i < array.length(); i++) {
                    JSONObject obj = array.getJSONObject(i);
                    int id = obj.getInt("Codigo");
                    String mailDe = obj.isNull("De") ? null : obj.getString("De");
                    String mailCodigoDe = obj.isNull("CodigoDe") ? null : obj.getString("CodigoDe");
                    String mailPara = obj.isNull("Para") ? null : obj.getString("Para");
                    String mailCodigoPara = obj.isNull("CodigoPara") ? null : obj.getString("CodigoPara");
                    String mailAsunto = obj.isNull("Asunto") ? null : obj.getString("Asunto");
                    Date mailFecha = formatter.parse(obj.getString("Fecha"));
                    String mailDetalle = obj.isNull("Cuerpo") ? null : obj.getString("Cuerpo");
                    Boolean mailLeido = obj.getBoolean("Leido");
                    Boolean mailRespondido = obj.getBoolean("Respondido");
                    int mailRpta = obj.getInt("Respuesta");
                    String mailMovilId = obj.isNull("CodigoMovil") ? null : obj.getString("CodigoMovil");
                    String mailConCopia = obj.getString("ConCopia");
                    String mailArchivo = obj.isNull("Archivo") ? null : obj.getString("Archivo");
                    
                    JSONArray archivos = obj.isNull("Archivos") ? new JSONArray() : obj.getJSONArray("Archivos");
                	List<String> mailArchivos = new ArrayList<String>();
                	for (int i2 = 0; i2 < archivos.length(); i2++) {
                		mailArchivos.add(archivos.getString(i2));
                	}
                    
                    result.add(new Mensaje(id, mailDe, mailCodigoDe, mailPara, mailCodigoPara, mailAsunto, mailDetalle, mailFecha, mailLeido, mailRpta, mailRespondido, mailMovilId, mailConCopia, mailArchivo, mailArchivos));
                }
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
		}
		
		return result;
	}
    
    @Override
	public List<Mensaje> getAllEnviados(String codFamilia) {
    	
		List<Mensaje> result = new ArrayList<Mensaje>();
		String content = get("Mail_getAllEnviados/" + codFamilia.trim());
		
		if (content != null) {
			
			try {
				JSONTokener tokener = new JSONTokener(content);
				JSONArray array = (JSONArray) tokener.nextValue();
				for (int i = 0; i < array.length(); i++) {
                    JSONObject obj = array.getJSONObject(i);
                    int id = obj.getInt("Codigo");
                    String mailDe = obj.isNull("De") ? null : obj.getString("De");
                    String mailCodigoDe = obj.getString("CodigoDe");
                    String mailPara = obj.getString("Para");
                    String mailCodigoPara = obj.getString("CodigoPara");
                    String mailAsunto = obj.getString("Asunto");
                    Date mailFecha = formatter.parse(obj.getString("Fecha"));
                    String mailDetalle = obj.getString("Cuerpo");
                    Boolean mailLeido = obj.getBoolean("Leido");
                    Boolean mailRespondido = obj.getBoolean("Respondido");
                    int mailRpta = obj.getInt("Respuesta");
                    String mailMovilId = obj.isNull("CodigoMovil") ? null : obj.getString("CodigoMovil");
                    String mailConCopia = obj.getString("ConCopia");
                    String mailArchivo = obj.isNull("Archivo") ? null : obj.getString("Archivo");
                    
                    JSONArray archivos = obj.isNull("Archivos") ? new JSONArray() : obj.getJSONArray("Archivos");
                	List<String> mailArchivos = new ArrayList<String>();
                	for (int i2 = 0; i2 < archivos.length(); i2++) {
                		mailArchivos.add(archivos.getString(i2));
                	}
                    
                    result.add(new Mensaje(id, mailDe, mailCodigoDe, mailPara, mailCodigoPara, mailAsunto, mailDetalle, mailFecha, mailLeido, mailRpta, mailRespondido, mailMovilId, mailConCopia, mailArchivo, mailArchivos));
                }
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
		}
		
		return result;
	}

    @Override
	public String insertMensaje(Mensaje mail) {
    	String result = null;
        String content = post("Mail_Insert", mail);

        if (content != null) {
            try {
//                JSONTokener tokener = new JSONTokener(content);
//                JSONObject obj = (JSONObject) tokener.nextValue();
//                int id = obj.getInt("Codigo");
            	result = content;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        return result;
   
	}
    
    @Override
	public void marcarLeido(String id, String imei) {

    	try {
    		String content = put("Mail_MarcarLeido", id, imei);
    	} catch (Exception ex) {
    		ex.printStackTrace();
    	}
   
	}
    
    private String post(String path, Mensaje mail) {
        try {
            HttpPost request = new HttpPost(getRequestURI(path));
//            Date dt = mail.getMailFecha();
//            long date = Date.UTC(dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHours(),dt.getMinutes(), dt.getSeconds());
            
            JSONStringer m = new JSONStringer()
            	.object()
            	.key("mail")
            		.object()
	            		.key("CodigoPara").value(mail.getMailCodigoPara())
	            		.key("CodigoDe").value(mail.getMailCodigoDe())
	            		.key("Fecha").value("/Date(" + mail.getMailFecha().getTime() +")/")
	            		.key("Asunto").value(mail.getMailAsunto())
	            		.key("Cuerpo").value(mail.getMailDetalle())
	            		.key("DetalleDe").value("Familia de Datos Personales")
	            		.key("DetallePara").value("")
	            		.key("Archivo").value(null)
	            		.key("ConCopia").value("")//value("<ArrayOfString xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" />")
	            		.key("Respuesta").value(mail.getMailRpta())
	            		.key("CodigoMovil").value(mail.getMailMovilID())
            		
            		.endObject()
            	.endObject();
            
//            request.setHeader("Accept", "application/json; charset=utf-8");
            request.setHeader("Content-Type", "application/json; charset=utf-8");
            request.setEntity(new StringEntity(m.toString(), "UTF-8"));
            HttpResponse res = httpClient.execute(request);
            String content = EntityUtils.toString(res.getEntity());
            return content;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    
    private String put(String path, String id, String imei) {
        try {
            HttpPut request = new HttpPut(getRequestURI(path + "/" + id + "/" + imei));
            HttpResponse res = httpClient.execute(request);
            String content = EntityUtils.toString(res.getEntity());
            return content;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
	
	private String get(String path) {
        try {
            HttpGet request = new HttpGet(getRequestURI(path));
            request.setHeader("Authorization", SessionManager.getToken());
            HttpResponse res = httpClient.execute(request);
            String content = EntityUtils.toString(res.getEntity());
            return content;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    private URI getRequestURI(String path) throws URISyntaxException {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
//        String hostKey = context.getString(R.string.pref_host_key);
//        String host = prefs.getString(hostKey, context.getString(R.string.pref_host_default));
        String host = context.getString(R.string.pref_host_default) + prefs.getString("ColegioPF", "");
        //String portKey = context.getString(R.string.pref_port_key);
        //String port = prefs.getString(portKey, context.getString(R.string.pref_port_default));
        URI requestURI = new URI(host + "/MobileService.svc/" + path);
        //Log.i(LOG_TAG, "requestURI: " + requestURI);
        return requestURI;
    }

}
